package com.wei.czz.framework.blog.controller;

import java.util.List;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.blog.SpaceDto;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.blog.space.SpaceVo;
import com.wei.czz.common.vo.blog.space.SpaceFormVo;
import com.wei.czz.framework.blog.service.SpaceService;
import com.wei.czz.framework.blog.manager.BlogManager;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2021-03-15 10:29:48
 * className: SpaceController 用户博客空间操作请求接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("blog/space")
@AllArgsConstructor
public class SpaceController {

    private static final Logger log = LoggerFactory.getLogger(SpaceController.class);

    private final SpaceService spaceService;

    private final BlogManager blogManager;

    /**
     * 保存用户空间信息接口
     *
     * 调用方：
     *  1、后台管理页面-用户空间管理页面-空间操作弹出框调用
     *
     * 此接口会校验是否重复提交
     * @param spaceVo 空间信息对象
     */
    @Resubmit(message = "保存空间信息")
    @PostMapping("/save")
    @Auth(permit = "user:space:save")
    public Result<Object> saveSpace(@RequestBody SpaceVo spaceVo){
        log.info("开始用户空间信息保存业务。{}", spaceVo);
        // 请求参数校验
        if (StringUtils.isNotBlank(spaceVo.getSpaceId()) || StringUtils.isBlank(spaceVo.getName())
            || spaceVo.getSort() == null) {
            log.info("保存用户空间信息接口请求参数错误");
            return Result.paramFail();
        }

        spaceService.saveSpace(spaceVo);

        log.info("用户空间信息保存业务结束");
        return Result.success();
    }

    /**
     * 分页查询空间信息列表接口
     * 用户获取自己的空间信息列表接口
     *
     * 调用方：
     *  1、后台管理页面-用户空间管理页面调用
     * @param spaceFormVo 空间检索表单对象
     */
    @PostMapping("/list")
    @Auth(permit = "user:space:list")
    public Result<PageDto<SpaceDto>> getSpaceList(@RequestBody SpaceFormVo spaceFormVo){
        log.info("开始用户获取自己的空间列表业务。{}", spaceFormVo);

        if (spaceFormVo.getPage() == null || spaceFormVo.getLimit() == null || StringUtils.isBlank(spaceFormVo.getField())
            || StringUtils.isBlank(spaceFormVo.getOrder())) {
            log.info("分页查询空间信息列表接口分页参数错误");
            return Result.pageFail();
        }

        PageDto<SpaceDto> page = spaceService.getSpacePageList(spaceFormVo);

        log.info("用户获取自己的空间列表业务结束");
        return Result.success(page);
    }

    /**
     * 获取空间信息接口
     * 根据空间id，获取空间信息
     *
     * 调用方：
     *  1、后台管理页面-用户空间管理页面-空间操作弹出框调用
     * @param spaceId 空间id
     */
    @GetMapping("/info")
    @Auth(permit = "user:space:info")
    public Result<SpaceDto> getSpaceInfo(@RequestParam("spaceId") String spaceId){
        log.info("开始获取空间信息业务。{}", spaceId);

        if (StringUtils.isBlank(spaceId)) {
            log.info("获取空间信息接口请求参数错误");
            return Result.paramFail();
        }

        SpaceDto space = spaceService.getSpaceInfo(spaceId);
        // 设置空间id
        space.setSpaceId(spaceId);

        log.info("获取空间信息业务结束");
        return Result.success(space);
    }

    /**
     * 修改空间信息接口
     * 用户修改自己的空间信息
     *
     * 调用方：
     *  1、后台管理页面-用户空间管理页面-空间操作弹出框调用
     *
     * 此接口会校验是否重复提交
     * @param spaceVo 空间信息表单对象
     */
    @Resubmit(message = "修改空间信息")
    @PostMapping("/update")
    @Auth(permit = "user:space:update")
    public Result<Object> updateSpace(@RequestBody SpaceVo spaceVo){
        log.info("开始用户修改自己的空间信息业务。{}", spaceVo);

        // 请求参数校验
        if (StringUtils.isBlank(spaceVo.getSpaceId()) || StringUtils.isBlank(spaceVo.getName())
            || spaceVo.getSort() == null) {
            log.info("修改空间信息接口请求参数错误");
            return Result.paramFail();
        }

        spaceService.updateSpace(spaceVo);

        log.info("用户修改自己的空间信息业务结束");
        return Result.success();
    }

    /**
     * 删除空间信息接口
     * 用户删除自己的空间信息
     *
     * 调用方：
     *  1、后台管理页面-用户空间管理页面调用
     *
     * 此接口会校验是否重复提交
     * @param spaceIdList 空间id列表
     */
    @Resubmit(message = "删除空间信息")
    @RequestMapping("/delete")
    @Auth(permit = "user:space:delete")
    public Result<Object> deleteSpace(@RequestBody List<Long> spaceIdList){
        log.info("开始用户删除自己的空间信息业务。{}", spaceIdList);

        if (spaceIdList == null || spaceIdList.isEmpty()) {
            log.info("删除空间信息接口请求参数错误");
            return Result.paramFail();
        }

        blogManager.deleteSpace(spaceIdList);

        log.info("用户删除自己的空间信息业务结束");
        return Result.success();
    }

}
